package cn.smile.business.basic;

import cn.smile.bean.dto.basic.MemberInfoDTO;
import cn.smile.bean.entity.basic.MemberInfo;
import cn.smile.bean.form.basic.member.MemberAddForm;
import cn.smile.bean.form.basic.member.MemberUpdateForm;
import cn.smile.bean.form.basic.member.QueryMemberForm;
import cn.smile.bean.form.basic.member.UpdateBalanceForm;
import cn.smile.commons.domain.IBaseService;
import cn.smile.commons.enums.basic.BalanceOperateEnum;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.math.BigDecimal;
import java.util.List;

public interface IMemberService extends IBaseService<MemberInfo> {

    /**
     * 新增会员
     *
     * @param form 新增参数
     * @return 新增结果
     */
    Boolean addInfo(MemberAddForm form);

    /**
     * 更新会员信息
     *
     * @param form 更新参数
     * @return 更新结果
     */
    Boolean updateInfo(MemberUpdateForm form);

    /**
     * 检查会员号是否存在
     *
     * @param memberNo 会员号
     * @param id       会员ID(更新时存在)
     * @return 检查结果(true - 存在, false - 不存在)
     */
    Boolean checkNo(String memberNo, String id);

    /**
     * 分页查询店铺会员
     *
     * @param form 查询参数
     * @return 查询结果
     */
    IPage<MemberInfoDTO> getMemberPage(QueryMemberForm form);

    /**
     * 删除会员
     *
     * @param id 会员ID
     * @return 删除结果
     */
    Boolean delMember(String id);

    /**
     * 根据会员ID查询会员信息
     *
     * @param id 会员ID
     * @return 查询结果
     */
    MemberInfoDTO getMemberById(String id);

    /**
     * 查询会员基础对象
     *
     * @param id 会员ID
     * @return 查询结果
     */
    MemberInfoDTO getBaseMemberById(String id);

    /**
     * 更新会员账户余额
     *
     * @param form        更新参数
     * @param operateEnum 操作类型
     * @return 更新结果
     */
    BigDecimal updateBalance(UpdateBalanceForm form, BalanceOperateEnum operateEnum);

    /**
     * 查询会员列表
     *
     * @param form 查询参数
     * @return 查询结果
     */
    List<MemberInfoDTO> getMemberList(QueryMemberForm form);

    /**
     * 统计店铺会员数量
     *
     * @return 会员数量
     */
    Long countMemberByShop();

    /**
     * 会员总数量
     *
     * @param date 统计截止时间
     * @return 统计结果
     */
    Long countMemberByShop(String date);

    /**
     * 统计新增会员数量
     *
     * @param timeStart 查询日期-开始
     * @param timeEnd   查询日期-结束
     * @return 查询结果
     */
    Long countAddMemberNum(String timeStart, String timeEnd);
}
